package com.loong.android.tools;

import static android.content.Context.MODE_PRIVATE;

import android.content.Context;
import android.content.SharedPreferences;

import com.loong.android.utils.ContextUtils;

/**
 * 共享配置存储和读取，使用android的SharedPreferences实现。
 */
public class SharedStore {
    private final static String DEFAULT_NAME = "loong.SharedConfig";

    /**
     * 保存配置数据。使用android的SharedPreferences实现。
     * @param context 上下文
     * @param name 名称
     * @param key 键名
     * @param value 键值
     * @param async 是否采用异步提交的方式。同步提交使用的是SharedPreferences.Editor的commit方法，
     *              异步提交，则使用apply方法，异步提交可能无法立即读取到数据。
     */
    public static void store(Context context, String name, String key, String value, boolean async) {
        if(context == null) return;
        SharedPreferences sp = context.getSharedPreferences(name, MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, value);
        if(async) {
            editor.apply();
        }else {
            editor.commit();
        }
    }

    /**
     * 使用默认名称保存键值对配置。
     * 默认名称为：com.liecode.amix.core.SharedConfig
     * @param context 上下文
     * @param key 键名
     * @param value 键值
     * @param async 是否采用异步提交的方式
     */
    public static void store(Context context, String key, String value, boolean async) {
        store(context, DEFAULT_NAME, key, value, async);
    }

    /**
     * 在当前应用的上下文内使用默认名称保存键值对配置。
     * 默认名称为：com.liecode.amix.core.SharedConfig
     * @param key 键名
     * @param value 键值
     * @param async 是否采用异步提交的方式
     */
    public static void store(String key, String value, boolean async) {
        store(ContextUtils.getAppContext(), DEFAULT_NAME, key, value, async);
    }

    /**
     * 在当前应用的上下文内使用默认名称且使用同步方式来保存键值对配置。
     * 默认名称为：com.liecode.amix.core.SharedConfig
     * @param key 键名
     * @param value 键值
     */
    public static void store(String key, String value) {
        store(ContextUtils.getAppContext(), DEFAULT_NAME, key, value, false);
    }

    /**
     * 读取配置数据。使用android的SharedPreferences实现。
     * @param context 上下文
     * @param name 配置名称
     * @param key 键名
     * @param defValue 默认值
     */
    public static String read(Context context, String name, String key, String defValue) {
        if (context == null) return defValue;
        SharedPreferences sp = context.getSharedPreferences(name, MODE_PRIVATE);
        return sp.getString(key, defValue);
    }

    /**
     * 读取默认配置名称的键值，默认名称为: com.liecode.amix.core.SharedConfig
     * @param context 上下文
     * @param key 键名
     * @param defValue 默认值
     */
    public static String read(Context context, String key, String defValue) {
        return read(context, DEFAULT_NAME, key, defValue);
    }

    /**
     * 使用当前应用的上下文读取默认配置名称的键值
     * @param key 键名
     * @param defValue 默认值
     */
    public static String read(String key, String defValue) {
        return read(ContextUtils.getAppContext(), DEFAULT_NAME, key, defValue);
    }

    /**
     * 清除指定名称的配置
     * @param context 上下文
     * @param name 配置名称
     * @param async 是否采用异步提交的方式。
     */
    public static void clear(Context context, String name, boolean async) {
        if (context == null) return;
        SharedPreferences sp = context.getSharedPreferences(name, MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        if(async) {
            editor.apply();
        }else {
            editor.commit();
        }
    }

    /**
     * 清除默认名称的配置，默认名称为: com.liecode.amix.core.SharedConfig
     * @param context 上下文
     * @param async 是否采用异步提交的方式。
     */
    public static void clear(Context context, boolean async) {
        clear(context, DEFAULT_NAME, async);
    }

    /**
     * 使用当前应用的上下文清除默认名称的配置
     * @param async 是否采用异步提交的方式。
     */
    public static void clear(boolean async) {
        clear(ContextUtils.getAppContext(), DEFAULT_NAME, async);
    }

    /**
     * 使用当前应用的上下文且采用同步的方式清除默认名称的配置
     */
    public static void clear() {
        clear(ContextUtils.getAppContext(), DEFAULT_NAME, false);
    }
}
